package code.whmmm.util.spring.quartz.task;

import code.whmmm.util.spring.quartz.util.QuartzUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import code.whmmm.util.simple.TimeUtil;

/**
 * 对 线程 callable 的 执行日志和异常处理 进行了封装。相当于代理模式<br/>
 * 关于 日志 现在用的是 sl4j 可以考虑使用 mysql/postgresSql/elastic-search/mongodb
 *
 * @author Zero
 */
public abstract class AbstractLoggedTask {

    protected Logger log = LoggerFactory.getLogger(this.getClass());


    /**
     * <b>doTask 的包装方法，不能重写此方法 !! </b>
     * 使用 spring 代理 call 方法，使其 在 事务中执行。
     *
     * @return int
     */
    //@Transactional(rollbackFor = Exception.class)
    public Integer call() throws Exception {
        String taskName = getTaskName();
        long l = TimeUtil.getTimestamp();
        log.info(taskName + QuartzUtil.getStartLog());

        Integer i;
        try {
            i = doTask();
            log.info(taskName + QuartzUtil.getEndLog(l));
        } catch (Exception e) {
            log.error(taskName + " 执行异常");
            log.error(taskName, e);

            throw new Exception(e);
        }
        if (i == null) {
            return 0;
        }
        return i;

    }

    /**
     * 执行逻辑,这个方法 会以事务执行！在 call 方法上有 事务注解
     *
     * @return int
     */
    protected abstract Integer doTask();


    /**
     * 获取 记录日志任务名称(thread 线程 )
     *
     * @return String
     */
    public abstract String getTaskName();

    /**
     * true 可用，false 禁用
     *
     * @return true 可用，  false 禁用
     */
    public abstract boolean isEnable();


}
